home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_xemacs.idb / usr / freeware / lib / xemacs-20.4 / lisp / utils / detached-minibuf.el.z / detached-minibuf.el
Encoding:
Text File  |  1998-05-21  |  5.0 KB  |  163 lines

  1. ;;; detached-minibuf.el -- Support a detached minibuffer for XEmacs.
  2.  
  3. ;; Copyright (C) 1997 Alvin C. Shelton
  4.  
  5. ;; Author: Alvin Shelton <acs@acm.org>
  6. ;; Keywords: extensions
  7.  
  8. ;; This file is part of XEmacs.
  9.  
  10. ;; XEmacs is free software; you can redistribute it and/or modify it
  11. ;; under the terms of the GNU General Public License as published by
  12. ;; the Free Software Foundation; either version 2, or (at your
  13. ;; option) any later version.
  14.  
  15. ;; XEmacs is distributed in the hope that it will be useful, but
  16. ;; WITHOUT ANY WARRANTY; without even the implied warranty of
  17. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  18. ;; General Public License for more details.
  19.  
  20. ;; You should have received a copy of the GNU General Public License
  21. ;; along with XEmacs; if not, write to the Free Software Foundation,
  22. ;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23.  
  24. ;;; Synched up with: not in FSF.
  25.  
  26. ;;; Commentary:
  27.  
  28. ;; WARNING. DANGER.  This file reportedly crashes 19.14, use it only with a
  29. ;; recent XEmacs.
  30.  
  31. ;; Version: 1.1
  32.  
  33. ;;; Code:
  34.  
  35. ;;
  36. ;; Variable definitions
  37.  
  38. (defgroup detached-minibuf nil
  39.   "Support a detached minibuffer in XEmacs"
  40.   :group 'minibuffer
  41.   :prefix "minibuf-frame-"
  42.   :group 'frames)
  43.  
  44.  
  45. (defcustom add-minibuf-options t
  46.   "*If nil, prevent minibuffer options from being added to the Options menu.\
  47. This must be set before detached-minibuf is loaded."
  48.   :type 'boolean
  49.   :group 'detached-minibuf)
  50. (defcustom minibuf-frame-height 1
  51.   "*The height in lines of the minibuffer frame created by make-detached-minibuf"
  52.   :type 'integer
  53.   :group 'detached-minibuf)
  54. (defcustom minibuf-frame-width (frame-width (selected-frame))
  55.   "*The width in chars of the minibuffer frame created by make-detached-minibuf"
  56.   :type 'integer
  57.   :group 'detached-minibuf)
  58. (defcustom minibuf-frame-pos-y -2
  59.   "*The y position of the minibuffer frame as created by make-detached-minibuf"
  60.   :type 'integer
  61.   :group 'detached-minibuf)
  62. (defcustom minibuf-frame-pos-x -2
  63.   "*The x position of the minibuffer frame as created by make-detached-minibuf"
  64.   :type 'integer
  65.   :group 'detached-minibuf)
  66.  
  67. ;;
  68. ;; Add minibuffer options to the Options menu
  69. (if add-minibuf-options
  70.     (progn
  71.       (defun toggle-minibuf ()
  72.     (interactive)
  73.     (if (equal (frame-property (selected-frame) 'minibuffer) t)
  74.  
  75.         ;; This frame already has a minibuffer, so remove the minibuffer.
  76.         ;; Unfortunately, we must delete and redraw the frame
  77.         (let ((fp (frame-properties (selected-frame)))
  78.           (buf (current-buffer))
  79.           (orig (selected-frame)))
  80.  
  81.           ;; Create and select the new frame;
  82.           ;; we have to do this before we delete the old frame.
  83.           (setq fp (plist-remprop fp 'window-id)
  84.             fp (plist-remprop fp 'minibuffer))
  85.           (select-frame
  86.            (make-frame (plist-put fp 'minibuffer nil)))  
  87.           (switch-to-buffer buf)
  88.  
  89.           (set-frame-properties
  90.            orig (list 'minibuffer default-minibuffer-frame))
  91.           (delete-frame orig t))
  92.  
  93.       ;; This frame does not have a minibuffer, so add one
  94.       (set-frame-property (selected-frame) 'minibuffer t)))
  95.  
  96.       (add-menu-button '("Options" "Frame Appearance")
  97.                ["------" nil nil]
  98.                nil)
  99.       (add-menu-button '("Options" "Frame Appearance")
  100.                ["Toggle minibuffer"
  101.             (toggle-minibuf)
  102.             :style toggle
  103.             :active (not (equal (selected-frame)
  104.                         default-minibuffer-frame))
  105.             :selected (equal
  106.                    (frame-property (selected-frame) 'minibuffer)
  107.                    t)]
  108.                nil)
  109.       (add-menu-button '("Options" "Frame Appearance")
  110.                ["Default minibuffer here"
  111.             (setq default-minibuffer-frame (selected-frame))
  112.             :style toggle
  113.             :active (let ((mbf (frame-property
  114.                         (selected-frame) 'minibuffer)))
  115.                   (or (equal mbf (selected-frame))
  116.                       (equal mbf t)))
  117.             :selected (equal (selected-frame)
  118.                      default-minibuffer-frame)]
  119.                nil)
  120.       (add-menu-button '("Options" "Frame Appearance")
  121.                ["Make a detached minibuffer"
  122.             (make-detached-minibuf)
  123.             :style nil]
  124.                nil)))
  125.  
  126. ;;
  127. ;; Create a minibuffer-only frame.
  128. ;;
  129. ;; This function creates a frame named "minibuffer".
  130. ;; You will likely want this frame not to have a titlebar.
  131. ;; In order to do this for gwm, uncomment the following line
  132. ;; and add it to your .profile.gwm:
  133. ;; (set-window Emacs.minibuffer no-frame)
  134. ;;
  135. (defun make-detached-minibuf ()
  136.   "Create a standalone minibuffer"
  137.   (interactive)
  138.   (if (console-on-window-system-p)
  139.       (progn
  140.     (setq initial-frame-plist
  141.           (list 'minibuffer nil
  142.             'width (frame-width (selected-frame))
  143.             'height (frame-height (selected-frame))))
  144.     (setq default-minibuffer-frame
  145.           (make-frame
  146.            (list 'minibuffer 'only
  147.              'width minibuf-frame-width
  148.              'height minibuf-frame-height
  149.              'menubar-visible-p nil
  150.              'default-toolbar-visible-p nil
  151.              'name "minibuffer"
  152.              'top minibuf-frame-pos-y
  153.              'left minibuf-frame-pos-x
  154.              'has-modeline-p nil)))
  155.  
  156.     ;; Bogus!  But it avoids annoying screen flash at startup
  157.     (if (not command-line-args-left)
  158.         (frame-notice-user-settings)))))
  159.  
  160. (provide 'detached-minibuf)
  161.  
  162. ;;; detached-minibuf.el ends here
  163.